面试的三种形式

电话面试

与现场面试最大的区别就是应聘者见不到面试官,双方的沟通只能依靠声音。很多外企在电话面试时都会加上英语面试的环节,甚至有些公司全部面试都会用英语进行。对应聘者的听力提出了更高的要求。如果在面试的时候没有听清楚或听懂面试官的问题,千万不要不懂装懂答非所问,这是面试的大忌。当不确定面试官的问题时,一定要大胆的多提问,直到弄清楚面试官的意图为止。

共享桌面远程面试

目前只有为数不多的几家大公司会在邀请应聘者到公司参加现场面试前,先进行一两轮共享桌面的远程面试。面试最关心的是应聘者的编程习惯及调试能力。通常面试官认可的习惯:

  1. 思考清楚再开始编程。
  2. 良好的代码命名和缩进对齐习惯。
  3. 更够单元测试。通常面试官出的题目都是要求写函数解决某一问题,如果应聘者能够在定义函数之后,立即对该函数进行全面的单元测试,那就相当于向面试官证明了自己有着专业的软件开发经验。如果应聘者是先写单元测试用例,再写解决问题的函数,我相信面试官定会对你刮目相看,因为能做到测试在前、开发在后的程序员实在是太稀缺了,他会毫不犹豫地抛出绿色的橄榄枝。

通常我们在写代码的时候都会遇到问题。当应聘者运行代码发现结果不对之后的表现,也是面试官关注的重点,因为应聘者此时的反应、采取的措施都能体现出他的调试功底。如果应聘者能够熟练地设置断点单步跟踪查看内存分析调用栈,能很快发现问题的根源并最终解决问题,那么面试官将会觉得他的开发经验很丰富。调试能力是在书本上学不到的只有通过大量的软件开发实践才能积累出调试技巧。当面试官发现一个应聘者的调试功底很扎实的时候,他在写面试报告的时候是不会吝啬赞美之词的。

现场面试

在通过上述两个面试后,就会进行现场面试,应当做好以下准备:

  1. 规划好路线并估算出行时间,不迟到。
  2. 准备好得体的衣服,没有必要穿正装。
  3. 注意面试邀请函的面试流程。如果面试有好几轮,时间也很长,在面试过程中可能会觉得疲劳并思维变得迟钝。比如微软对技术职位通常有五论面试,连续几个小时处在高压的面试中,人难免会变得精疲力尽,因此可以带一些提神的饮料或食品。
  4. 准备几个问题。每一轮面试的最后,面试官都会让应聘者问几个问题,应聘者可以提前准备好问题。

现场面试时整个面试流程中的重头戏。由于是坐在面试官的对面,应聘者的一举一动都看在面试官的眼力。面试官通过应聘者的语言和行动,考查他的沟通能力学习能力编程能力等综合实力。

现场面试的三个环节

行为面试环节

面试开始的5~10分钟通常是行为面试的时间。在行为面试这个环节里,面试官会注意应聘者的性格特点,深入地了解简历中列举的项目经历。由于这一环节一般不会问技术难题,因此也是一个暖场的过程,应聘者可以利用这几分钟时间调整自己的情绪,进入面试的状态。

不少面试官会让应聘者做一个简短的自我介绍。由于面试官手中拿着应聘者的简历,而那里有应聘者的详细信息,因此此时的自我介绍不用花很多时间,用30秒到1分钟的时间介绍自己的主要学习、工作经历就即可如果面试官对你的某一段经历或者参与的某一个项目很感兴趣,他会有针对性地提几个问题详细了解。

简历中应聘者的项目经验

  1. Situation:简短的项目背景,比如项目的规模,开发的软件的功能、目标用户等。
  2. Task:自己完成的任务。这个要写详细,要让面试官对自己的工作一目了然。在用词上要注意区分“参与”和“负责”:如果只是加入某一个开发团队写了几行代码就用“负责”,那就很危险。面试官看到简历上应聘者“负责”了某个项目,他可能就会问项目的总体框架设计、核心算法、团队合作等问题。这些问题对于只是简单参与”的人来说,是很难回答的,会让面试官认为你不诚实,印象分会减去很多。
  3. Action:为了完成任务自己做了哪些工作,是怎么做的。这里可以详细介绍。做系统设计的,可以介绍系统架构的特点;做软件开发的,可以写基于什么工具在哪个平台下应用了哪些技术;做软件测试的,可以写是手工测试还是自动化测试,是白盒测试还是黑盒测试等。
  4. Result:自己的贡献。这些方面信息可以写得具体些,最好能用数字加以说明。如果是参与功能开发,可以说按时完成了多少功能;如果做优化,可以说性能提高的百分比是多少;如果是维护,可以说修改了多少个Bug。

举例:



应聘者掌握的技能,了解,熟悉,精通

了解


熟悉:

精通:

回答“为什么跳槽”

面试官只是想通过这个问题来了解应聘者的性格,可以根据自己的真实想法来回答这个问题但也不能想说什么就说什么,回答这个问题时不要抱怨,也不要流露出负面的情绪。应当尽量避免以下4个原因:

  1. 老板太苛刻。
  2. 同事太难相处。面试官可能会觉得这个人本身就很难相处。
  3. 加班太频繁。对于大部分IT企业来说,加班是家常便饭。这么说等于不想进这家公司。
  4. 工资太低。不建议在面试的时候对面试官抱怨,等完成技术面试之后谈offer时,再和HR谈工资也不迟。通过面试后我们就掌握主动了,想怎么谈就怎么谈,如果工资真的开高了HR会和你很客气地商量的。

技术面试环节

面试官在通过简历及行为面试大致了解应聘者的背景之后,接下来就要开始技术面试了。一轮1小时的面试,通常技术面试会占40-50分钟,这是面试的重头戏,对面试的结果起决定性作用。总体面试官会关注应聘者5种素质:扎实的基础知识、能写高质量的代码、分析问题思路清晰、能优化时间和空间效率,以及学习沟通等各方面的能力。

扎实的基础知识

基本功在编程面试环节体现在三个方面:编程语言、数据结构和算法。



高质量的代码

只有注重质量的程序员,才能写出鲁棒稳定的大型软件。在面试过程中,面试官总会格外关注边界条件特殊输入等看似细枝末节但实质至关重要的地方,以考查应聘者是否注重代码质量。很多时候,面试官发现应聘者写出来的代码只能完成最基本的功能,一旦输入特殊的边界条件参数就会错误百出甚至程序崩溃。

总有些应聘者很困惑:面试的时候觉得题目很简单,感觉自己都做出来了,可最后为什么被拒了呢?在技术面试过程中,技术面试的面试官一般都是程序员,他们只认一个理:题目做对、做完整了,就让你通过面试;否则失败。所以遇到简单题目却被拒的情况,应聘者应认真反思在思路或者代码中存在哪些漏洞。

通常越是简单的问题,面试官的期望值就会越高。如果题目很简单,面试官会期待应聘者能够很完整的解决问题。除了完成基本功能以外,还要考虑到边界条件、错误处理等各个方面。还要考虑程序是否足够鲁棒。

要想很好地解决前面的问题,最好的办法是在动手写代码之后想好测试用例。只有把各种可能的输入事先都想好了,才能在写代码的时候把各种情况都做相应的处理。写完代码之后,也不要立刻给面试官检查,而是先在心里默默地运行。当输入之前想好的所有测试用例都能得到合理的输出时,再把代码交给面试官。做到了这一步,offer就很简单了。

清晰的思路

对于确实很复杂的问题,面试官甚至不期待应聘者能在面试不到一个小时的时间里给出完整的答案,更看重的可能还是应聘者是否有清晰的思路。面试官通常不喜欢应聘者在没有形成清晰思路之前就草率地开始写代码,这样写出来的代码容易逻辑混乱、错误百出。

应聘者可以用几个简单的方法帮助自己形成清晰的思路。
首先是举几个简单的具体例子让自己理解问题。当我们一眼看不出问题中隐藏的规律的时候,可以试着用一两个具体的例子模拟操作的过程,这样说不定就能通过具体的例子找到抽象的规律。
其次可以试着用图形表示抽象的数据结构。像分析与链表、二叉树相关的题目,我们都可以画出它们的结构来简化题目。
最后可以试着把复杂的问题分解成若干个简单的子问题,再解决。很多基于递归的思路,包括分治法和动态规划,都是把复杂的问题分解成一个或者多个简单的子问题。

优化效率的能力

优秀的程序员对时间和内存的消耗锱铢必较,他们很有激情地不断优化自己的代码。当面试官出的题目有多种解法的时候,通常他会期待应聘者最终能够找到最优解。当面试官提示还有更好的解法的时候,应聘者不能放弃思考,而应该努力寻找在时间消耗或者空间消耗上可以优化的地方。

要想优化时间或者空间效率,首先要知道如何分析效率。即使是同一个算法,用不同方法实现的效率可能也会大不相同,我们要能够分析出算法及其代码实现的效率。

要想优化代码的效率,我们还要熟知各种数据结构的优缺点,并能选择合适的数据结构解决问题。

要想优化代码的效率,我们也要熟练掌握常用的算法。面试中最常用的算法是査找和排序。

优秀的综合能力

除了展示自己的编程能力和技术功底之外,还需要展示自己的软能力,诸如自己的沟通能力学习能力。软件开发已经告别了单打独斗的年代,程序员与他人的沟通变得越来越重要。知识迁移能力是一种特殊的学习能力。如果我们能够把已经掌握的知识迁移到其他领域,那么学习新技术或者解决新问题就会变得容易。还有些面试官喜欢考察应聘者的抽象建模能力和发散思维能力。

应聘者提问环节

在结束面试前的5-10分钟,面试官会给应聘者机会提几个问题,应聘者的问题质量也会对面试的结果有一定的影响。面试官让应聘者问几个问题,主要是想了解他最关心的问题有哪些,因此应聘者至少要问一两个问题。问得问题合适,是加分项,问的问题不合适,那就是减分项。

有些问题是不适合在技术面试这个环节问的。首先,不要问和自己职位没有关系的问题。比如面试职位是一线的开发问公司五年的发展战略。其次是不要问薪水,技术面试不是谈薪水的时候,要谈工资要等通过面试后和HR谈。再次是不要立即打听面试结果,现在大部分公司面试都有好几轮,最终决定应聘者能不能通过面试,是要把面试官的评价综合起来的,问这个等于白问。还会让人觉得没有自我评价的能力。

推荐问的问题是与招聘的职位或者与项目相关的问题,如果这种类的问题问的很好,就加分。不过要问好这类的问题首先应聘者应对应聘的职位或项目的背景有一定的了解。可以从两方面去了解。一是面试前做足功课,到网上去搜集相关的信息,做到对公司成立时间、主要业务、职位要求都了解。二是在面试过程中留意面试官说过的话。有不少面试官在面试前会简单介绍与招聘职位相关的项目,其中会包含其他渠道无法获得的信息,比如项目的进展情况等,可以从中找出一两个点,然后向面试官提问。